www.gusucode.com > MIMO与SISO仿真程序 > MIMO-OFDM/all code/SISO_v3_7_all_channel_effects_time_pilot.m
% OFDM 2 transmitter/receiver transmission % Name: Benjamin Pham % Student ID: 25957066 % % Task: to simulate a transmission of data using OFDM technique % blocks to so simulate, modulation block, IFFT, P/S, % FFT, demodulate, recover signal. then add (2) Noise,(3) Multipath Channel clc;clear all; close all; warning off %% Set Parameters % amount of data to be transmitted % 64kb is 2^16 % ^20 is a megabit n = 16; bits = 2^n; p = log2(bits); % fft/ifft size n_fft = 64; % cyclic prefix size n_cp = 0.25*n_fft; % snr snr = [0:1:30]; % attenuationx % eb_no = snr.*(B/Rb); t_data = round(rand(bits,1)); % generate data OFDM = n_fft+n_cp; channel = randn() +j*randn() DS = 63; PS = 1; % NS = n_fft - DS - PS; for mod_value = [1:3] % bits per symbol if mod_value == 1 symbols = 2; pilot = [0 1]'; while floor(length(t_data)/symbols) ~= length(t_data)/symbols t_data = [t_data; zeros(1,1)]; %padding for symbol mapping end while floor(length(t_data)/symbols/DS) ~= length(t_data)/symbols/DS t_data = [t_data; zeros(1,1)]; %padding for subcarriers mapping end elseif mod_value == 2 symbols = 4; pilot = [0 0 0 1]'; while floor(length(t_data)/symbols) ~= length(t_data)/symbols t_data = [t_data; zeros(1,1)]; %padding for symbol mapping end while floor(length(t_data)/symbols/DS) ~= length(t_data)/symbols/DS t_data = [t_data; zeros(1,1)]; %padding for subcarriers mapping end elseif mod_value == 3 symbols = 6; pilot = [0 0 0 0 0 1]'; while floor(length(t_data)/symbols) ~= length(t_data)/symbols t_data = [t_data; zeros(1,1)]; %padding for symbol mapping end while floor(length(t_data)/symbols/DS) ~= length(t_data)/symbols/DS t_data = [t_data; zeros(1,1)]; %padding for subcarriers mapping end end mod_method = 2^symbols; %% TRANSMITTER %% Generate data to be sent % 64kb of data % changes vector to char type %% symbol mapping % 4QAM, 16QAM mod_data = qammod(t_data,mod_method,'unitaveragepower',true,'inputtype','bit'); pilot = qammod(pilot,mod_method,'unitaveragepower',true,'inputtype','bit'); %figure() %scatterplot(mod_data) %% IFFT % Moves the data from the time domain to the frequency domain X = mod_data; % while floor(length(X)/DS) ~= length(X)/DS % X = [X; zeros(1,1)]; %padding for symbol mapping % end % data symbols in OFDM frame X_data = reshape(X,DS,length(X)/DS); % pilot insertion X_blocks = [ones(1,length(X_data))*pilot;X_data]; % IDFT operation x = ifft(X_blocks); % Inverse fast fourier transform %% add CP x_cp = [x((end - n_cp + 1):end,:);x]; % add CP to end of data %% Parallel data to Serial stream x_s = x_cp(:); %% CHANNEL %% Multipath Channel % delays and attentuation that affects H_x = x_s*channel; %H_x = x_s; %% AWGN Noise for i = 1:length(snr) H_noise = awgn(H_x,snr(i),'measured'); delay = 17; % tail of previous symbol added to front of next symbol - ISI for j = 0:(length( H_noise)/(OFDM))-2 if delay ~= 0 H_noise(1+OFDM+OFDM*j:1+OFDM+delay+OFDM*j) = H_noise(1+OFDM+OFDM*j:1+OFDM+delay+OFDM*j) ... + H_noise(OFDM-delay+OFDM*j:OFDM+OFDM*j); end end if delay ~= 0 H_noise(1:OFDM) = [zeros(delay+1,1); H_noise(1:OFDM-delay-1)]; end %% RECEIVER %% Serial to Parallel y_p = reshape(H_noise, OFDM, length(H_noise)/OFDM); % remove cp y_p_cp = y_p((n_cp + 1):end,:); %% FFT % converts signal from time domain to frequency domain Y_blocks = fft(y_p_cp); Y_pilots = Y_blocks(1,:); % extract data symbols Y_data = Y_blocks(2:64,:); Y = Y_data(:); %% Channel Estimation % because we send pilot symbols, we can estimate the channel. symbols that % are known beforehand. So its the received signal divided by the pilot % symbol. H_hat = Y_pilots./pilot; % estimating channel using pilot symbols %% equalisation H_hate = mean(H_hat); % found a mistake where taking the abs of it caused a very weird results in the equalisation Y_blocks2 = Y./H_hate; % cancelling out the channel effects %% Demodulate equalistation part y2 = qamdemod(Y_blocks2,mod_method,'unitaveragepower',true,'outputtype','bit'); received_sig2 = y2(:); errors2(mod_value,i) = 0; % received_sig2b = [zeros(delay,1); received_sig2]; for m = [1:length(received_sig2)-n_fft*symbols] if received_sig2(m+n_fft*symbols) ~= t_data(m+n_fft*symbols) errors2(mod_value,i) = errors2(mod_value,i) + 1; end end ber2(mod_value,i) = errors2(mod_value,i)/length(t_data); end %figure() %semilogy(snr,ber(mod_value,:),'x-',snr,ber2(mod_value,:),'o-'); semilogy(snr-10*log10(symbols),ber2(mod_value,:),'-'); title('BER vs SNR'); legend('4QAM','16QAM','64QAM'); xlabel('E_b/N_o (dB)'); ylabel('BER'); grid on; hold on end